import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;

public class HomeView extends JFrame {
    //公共起始值
    public static final long START_STRING = 230601720000L;

    //公共结束值
    public static final String  END_STRING = "-(未提交)";

    // 变量接受输入框对应值
    //创建路径
    private JTextField filePathField;
    private JTextField fromField;
    private JTextField toField;
    //主路径
    private JTextField homeFilePathField;
    //学生文件路径
    private JTextField studentFilePathField;

    // 构造方法
    public HomeView() {
        // 设置框架标题
        setTitle("主界面");

        // 设置框架关闭操作
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 设置框架大小
        setSize(400, 400); // 减小了高度以适应内容

        // 设置框架居中显示
        setLocationRelativeTo(null);

        // 创建一个面板来放置组件
        JPanel panel = new JPanel();
        add(panel);

        // 使用GridBagLayout来灵活布局组件
        GridBagLayout layout = new GridBagLayout();
        panel.setLayout(layout);
        GridBagConstraints constraints = new GridBagConstraints();

        // 设置默认的填充和权重
        constraints.fill = GridBagConstraints.HORIZONTAL;
        constraints.weightx = 1.0;

// ...（其他代码保持不变）

// 创建大输入框，用于输入文件路径
        filePathField = new JTextField(40); // 可以保留较大的列宽作为提示，但这不是实际像素宽度
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 2; // 横跨两列
        constraints.insets = new Insets(5, 5, 30, 5); // 上、左、下、右间距
        constraints.fill = GridBagConstraints.HORIZONTAL; // 确保组件水平填充
        constraints.weightx = 1.0; // 当容器大小改变时，给予水平扩展的权重

// 直接将JLabel和JTextField添加到panel中，不使用额外的JPanel和FlowLayout
        panel.add(new JLabel("文件路径:"), constraints);
// 需要克隆constraints以避免影响后续添加的组件
        GridBagConstraints filePathFieldConstraints = (GridBagConstraints) constraints.clone();
        filePathFieldConstraints.insets = new Insets(5, 60, 30, 5); // 调整左间距以留出标签的空间
        layout.setConstraints(filePathField, filePathFieldConstraints);
        panel.add(filePathField);

// 重置constraints的属性以准备下一个组件的添加（这部分代码在您的原始代码中已经存在）
        constraints.gridy = 1;
        constraints.gridwidth = 1;
        constraints.insets = new Insets(0, 5, 5, 5);
        constraints.fill = GridBagConstraints.HORIZONTAL; // 重置填充属性（虽然这里不是必须的，但保持清晰是个好习惯）
        constraints.weightx = 1.0; // 重置权重属性（同样，这里不是必须的）

// ...（其他代码保持不变，包括创建fromPanel和toPanel等）
        // 创建两个小输入框，用于输入整数范围区间
        //JLabel labelFrom = new JLabel("范围起始:");
        //fromField = new JTextField(10);
        //JLabel labelTo = new JLabel("范围结束:");
        //toField = new JTextField(10);

        // 添加“范围起始:”标签和输入框
        //JPanel fromPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        //fromPanel.add(labelFrom);
        //fromPanel.add(fromField);
        //constraints.gridx = 0; // 第一列
        //panel.add(fromPanel, constraints);

        // 添加“范围结束:”标签和输入框
        //JPanel toPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        //toPanel.add(labelTo);
        //toPanel.add(toField);
        //constraints.gridx = 1; // 第二列
        //panel.add(toPanel, constraints);

        // 重置constraints的gridy和gridx以准备按钮
        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.gridwidth = 2; // 横跨两列
        constraints.insets = new Insets(15, 20, 10, 20); // 添加一些垂直间距

        // 创建一个按钮
        JButton button = new JButton("创建");
        panel.add(button, constraints);
        // 添加按钮的点击事件监听器
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 获取各个输入框的值
                String filePath = getFilePath();
                String from = getFrom();
                String to = getTo();
                String homeFilePath=getHomeFilePath();
                String studentFilePath=studentFilePathField.getText();


                // 打印值
                System.out.println("文件路径: " + filePath);
                System.out.println("范围起始: " + from);
                System.out.println("范围结束: " + to);
                System.out.println("大文件路径: " + homeFilePath);

                //保存文件
                FileTool.writeToFile(filePath, from, to,homeFilePath,studentFilePath);

                //调用其他方法执行逻辑
                createDir(filePath, from, to);

                //创建文件
                FileTool.createFile(filePath,StudentTool.FILE_NAME);
            }
        });
        // 可以在这里添加按钮的点击事件监听器，如果需要的话
        // button.addActionListener(e -> {
        //     // 处理按钮点击事件
        // });
        //

        //文字:输入更新路径
        JLabel homeFilePathLabel = new JLabel("输入更新路径:");
        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.gridwidth = 1; // 横跨一列
        constraints.insets = new Insets(15, 20, 10, 20); // 添加一些垂直间距
        layout.setConstraints(homeFilePathLabel, constraints);
        panel.add(homeFilePathLabel);


        //这里同样来个大输入框
        // 创建大输入框，用于输入文件路径
        homeFilePathField = new JTextField(40); // 可以保留较大的列宽作为提示，但这不是实际像素宽度
        constraints.gridx = 0;
        constraints.gridy = 3;
        constraints.gridwidth = 2; // 横跨两列
        constraints.insets = new Insets(15, 15, 70, 15); // 上、左、下、右间距
        constraints.fill = GridBagConstraints.HORIZONTAL; // 确保组件水平填充
        constraints.weightx = 1.0; // 当容器大小改变时，给予水平扩展的权重
        layout.setConstraints(homeFilePathField, constraints);
        panel.add(homeFilePathField);



        //更新按钮
        // 重置constraints的gridy和gridx以准备按钮
        constraints.gridx = 0;
        constraints.gridy = 3;
        constraints.gridwidth = 3; // 横跨两列
        constraints.insets = new Insets(15, 20, 10, 20); // 添加一些垂直间距

        JButton button2 = new JButton("更新");
        panel.add(button2, constraints);
        button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("更新文件");
                //refreshFileContents();
                //跟新全部
                searchFile(homeFilePathField.getText());
                //保存文件
                // 获取各个输入框的值
                String filePath = getFilePath();
                String from = getFrom();
                String to = getTo();
                if(from==null){
                    from="1";
                }
                if(to==null){
                    to="2";
                }
                String homeFilePath=getHomeFilePath();
                String studentFilePath=studentFilePathField.getText();


                // 打印值
                System.out.println("文件路径: " + filePath);
                System.out.println("范围起始: " + from);
                System.out.println("范围结束: " + to);
                System.out.println("大文件路径: " + homeFilePath);

                //保存文件
                FileTool.writeToFile(filePath, from, to,homeFilePath,studentFilePath);

            }

        });

        //文本:学生文件路径
        JLabel studentFilePathLabel = new JLabel("学生文件路径: ");
        constraints.gridx = 0;
        constraints.gridy = 4;
        constraints.gridwidth = 1; // 横跨两列
        constraints.insets = new Insets(15, 15, 10, 15); // 上、左、下、右间距
        constraints.fill = GridBagConstraints.HORIZONTAL; // 确保组件水平填充
        constraints.weightx = 1.0; // 当容器大小改变时，给予水平扩展的权重
        layout.setConstraints(studentFilePathLabel, constraints);
        panel.add(studentFilePathLabel);


        //这里同样来个大输入框
        // 创建大输入框，用于输入文件路径
        studentFilePathField = new JTextField(40); // 可以保留较大的列宽作为提示，但这不是实际像素宽度
        constraints.gridx = 0;
        constraints.gridy = 5;
        constraints.gridwidth = 1; // 横跨两列
        constraints.insets = new Insets(15, 15, 10, 15); // 上、左、下、右间距
        constraints.fill = GridBagConstraints.HORIZONTAL; // 确保组件水平填充
        constraints.weightx = 1.0; // 当容器大小改变时，给予水平扩展的权重
        layout.setConstraints(studentFilePathField, constraints);
        panel.add(studentFilePathField);




        //读取文件
        readFileContents();
    }

    //寻找文件方法
    public  void searchFile(String directoryPath) {
        File directory = new File(directoryPath);

        // 检查传入的路径是否是一个目录
        if (!directory.isDirectory()) {
            System.out.println("提供的路径不是一个有效的目录: " + directoryPath);
            showWarningMessage("提供的路径不是一个有效的目录: " + directoryPath);
            return;
        }

        // 调用递归方法搜索文件
        searchFileRecursively(directory);
    }

    private  void searchFileRecursively(File directory) {
        // 获取目录中的所有文件和子目录
        File[] files = directory.listFiles();

        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    // 如果是目录，则递归搜索
                    searchFileRecursively(file);
                } else if (file.isFile() && file.getName().equals(StudentTool.FILE_NAME)) {
                    // 如果是文件且文件名匹配
                    System.out.println("在路径" + file.getParent() + "下找到目标");
                    refreshFileContents(file.getParent());
                }
            }
        }
    }

    // 更新文件方法(重载,传入目标路径)
    public void refreshFileContents(String filePathField) {
        File rootFolder = new File(filePathField);

        // 检查根文件夹是否存在
        if (!rootFolder.exists() || !rootFolder.isDirectory()) {
            System.out.println("Root folder does not exist or is not a directory.");
            return;
        }

        // 获取根文件夹下的所有文件和文件夹
        File[] filesAndFolders = rootFolder.listFiles();

        if (filesAndFolders != null) {

            //创建集合,统计未提交学生名单
            ArrayList<String> unSubmittedStudents = new ArrayList<>();

            for (File fileOrFolder : filesAndFolders) {
                // 只处理文件夹
                if (fileOrFolder.isDirectory()) {
                    String folderName = fileOrFolder.getName();

                    // 检查文件夹名称中是否包含END_STRING
                    if (folderName.contains(END_STRING)) {
                        // 获取文件夹内的所有文件和子文件夹
                        File[] contents = fileOrFolder.listFiles();

                        // 如果文件夹不为空（即包含内容）
                        if (contents != null && contents.length > 0) {
                            // 构建新的文件夹名称（去除END_STRING部分）
                            String newFolderName = folderName.replace(END_STRING, "");

                            // 获取新的文件夹对象
                            File newFolder = new File(rootFolder, newFolderName);

                            // 重命名文件夹
                            boolean renamed = fileOrFolder.renameTo(newFolder);

                            if (renamed) {
                                System.out.println("Renamed folder: " + folderName + " to " + newFolderName);
                            } else {
                                System.out.println("Failed to rename folder: " + folderName);
                            }
                        }
                        else{
                            //如果文件夹为空
                            //文件夹名字格式为230601720035-周志豪-(未提交)
                            //获取学生姓名
                            String[] split = folderName.split("-");
                            String studentName = split[1];
                            //加入集合
                            unSubmittedStudents.add(studentName);
                        }
                    }
                }
            }
            //循环结束,向当前文件路径下写入未提交学生名单
            //要求示例:
            //A未提交名单.txt
            //大数据-第一次作业   /*这里大数据-第一次作业:是通过上两级文件夹名字拼接的,当前文件路径为filePathField*/
            //张三 李四 王五     /*学生名字只空格,不换行*/
            //共3人未提交作业
            //写一个方法实现这个逻辑
            // 获取当前文件路径，并构造文件名

            String parentFolderName1 = new File(rootFolder.getParent()).getName();
            // 获取当前文件或文件夹的名称
            String parentFolderName2 = rootFolder.getName();
            String fileName = "未提交名单.txt";
            if(unSubmittedStudents.size()==0){
                fileName = "已全部提交.txt";
            }
            String contentHeader = "<<<"+parentFolderName1 + "-" + parentFolderName2+">>>";

            writeUnSubmittedStudents(unSubmittedStudents, filePathField, contentHeader, fileName);
            System.out.println("执行完毕");
        } else {
            System.out.println("Root folder is empty or an error occurred while listing files and folders.");
        }
    }
    // 更新文件方法
    public void refreshFileContents() {
        File rootFolder = new File(filePathField.getText());

        // 检查根文件夹是否存在
        if (!rootFolder.exists() || !rootFolder.isDirectory()) {
            System.out.println("Root folder does not exist or is not a directory.");
            return;
        }

        // 获取根文件夹下的所有文件和文件夹
        File[] filesAndFolders = rootFolder.listFiles();

        if (filesAndFolders != null) {

            //创建集合,统计未提交学生名单
            ArrayList<String> unSubmittedStudents = new ArrayList<>();

            for (File fileOrFolder : filesAndFolders) {
                // 只处理文件夹
                if (fileOrFolder.isDirectory()) {
                    String folderName = fileOrFolder.getName();

                    // 检查文件夹名称中是否包含END_STRING
                    if (folderName.contains(END_STRING)) {
                        // 获取文件夹内的所有文件和子文件夹
                        File[] contents = fileOrFolder.listFiles();

                        // 如果文件夹不为空（即包含内容）
                        if (contents != null && contents.length > 0) {
                            // 构建新的文件夹名称（去除END_STRING部分）
                            String newFolderName = folderName.replace(END_STRING, "");

                            // 获取新的文件夹对象
                            File newFolder = new File(rootFolder, newFolderName);

                            // 重命名文件夹
                            boolean renamed = fileOrFolder.renameTo(newFolder);

                            if (renamed) {
                                System.out.println("Renamed folder: " + folderName + " to " + newFolderName);
                            } else {
                                System.out.println("Failed to rename folder: " + folderName);
                            }
                        }
                        else{
                            //如果文件夹为空
                            //文件夹名字格式为230601720035-周志豪-(未提交)
                            //获取学生姓名
                            String[] split = folderName.split("-");
                            String studentName = split[1];
                            //加入集合
                            unSubmittedStudents.add(studentName);
                        }
                    }
                }
            }
            //循环结束,向当前文件路径下写入未提交学生名单
            //要求示例:
            //A未提交名单.txt
            //大数据-第一次作业   /*这里大数据-第一次作业:是通过上两级文件夹名字拼接的,当前文件路径为filePathField*/
            //张三 李四 王五     /*学生名字只空格,不换行*/
            //共3人未提交作业
            //写一个方法实现这个逻辑
            // 获取当前文件路径，并构造文件名

            String parentFolderName1 = new File(rootFolder.getParent()).getName();
            // 获取当前文件或文件夹的名称
            String parentFolderName2 = rootFolder.getName();   String fileName = "未提交名单.txt";
            String contentHeader = "<<<"+parentFolderName1 + "-" + parentFolderName2+">>>";

            writeUnSubmittedStudents(unSubmittedStudents, filePathField.getText(), contentHeader, fileName);

        } else {
            System.out.println("Root folder is empty or an error occurred while listing files and folders.");
        }
    }

    //未提交名单写入具体内容
    public static void writeUnSubmittedStudents(ArrayList<String> unSubmittedStudents, String filePathField, String contentHeader, String fileName) {
        StringBuilder content = new StringBuilder();
        content.append(contentHeader).append("\n\n");

        for (String student : unSubmittedStudents) {
            content.append(student).append(" ");
        }

        content.append("\n\n共").append(unSubmittedStudents.size()).append("人未提交作业");

        File file = new File(filePathField, fileName);
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
            writer.write(content.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("未提交名单已写入文件: " + file.getAbsolutePath());
    }
    //创建文件夹方法
    private void createDir(String filePath, String from, String to) {
        try {
            // 将 from 和 to 字符串转换为 long 类型
            long fromNumber = Long.parseLong(from);
            long toNumber = Long.parseLong(to);

            // 获取 filePath 对应的 File 对象
            File dir = new File(filePath);
            if (!dir.exists()) {
                dir.mkdirs(); // 如果目录不存在，则创建它
            }

            //先判断情况
            //如果有学生文件
            StudentTool.studentList=new ArrayList<>();
            if(StudentTool.readStudentFromFile(studentFilePathField.getText())){
                //改一下,根据学生集合创建文件夹
                StudentTool.studentList.forEach(student -> {
                    String folderName = student+END_STRING;
                    File newFolder = new File(dir, folderName);
                    if (!newFolder.exists()) {
                        newFolder.mkdir(); // 创建文件夹
                    }
                });
            }else {
                for (long i = fromNumber; i <= toNumber; i++) {
                    // 生成文件夹名称
                    String folderName = Long.toString(START_STRING + i);
                    folderName+=END_STRING;
                    File newFolder = new File(dir, folderName);
                    if (!newFolder.exists()) {
                        newFolder.mkdir(); // 创建文件夹
                    }
                }
            }

            // 遍历 from 到 to 的范围，并创建文件夹
            /*for (long i = fromNumber; i <= toNumber; i++) {
                // 生成文件夹名称
                String folderName = Long.toString(START_STRING + i);
                folderName+=END_STRING;
                File newFolder = new File(dir, folderName);
                if (!newFolder.exists()) {
                    newFolder.mkdir(); // 创建文件夹
                }
            }*/

            /*for (long i = fromNumber; i <= toNumber; i++) {
                // 生成文件夹名称
                String folderName = Long.toString(START_STRING + i);
                folderName+=END_STRING;
                File newFolder = new File(dir, folderName);
                if (!newFolder.exists()) {
                    newFolder.mkdir(); // 创建文件夹
                }
            }*/

            System.out.println("文件夹创建成功！");
        } catch (NumberFormatException e) {
            System.err.println("输入的 from 或 to 不是有效的数字：" + e.getMessage());
            showWarningMessage("输入的 from 或 to 不是有效的数字！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Getter方法用于获取输入框的值
    public String getFilePath() {
        return filePathField.getText();
    }

    public String getFrom() {
        if(fromField==null){
            return "1";
        }else{
            return fromField.getText();
        }

    }

    public String getTo() {
        if(toField==null){
            return "2";
        }else {
            return toField.getText();
        }

    }

    public String getHomeFilePath() {
        return homeFilePathField.getText();
    }

    //警告窗口方法
    public static void showWarningMessage(String message) {
        JOptionPane.showMessageDialog(null, message, "警告", JOptionPane.WARNING_MESSAGE);
    }

    //读取方法
    private void readFileContents() {
        // 使用FileTool类中的静态常量作为文件路径
        String filePath = FileTool.WRITE_FILE_PATH;

        // 尝试读取文件内容
        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line1 = reader.readLine(); // 读取第一行
            String line2 = reader.readLine(); // 读取第二行
            String line3 = reader.readLine(); // 读取第三行
            String line4 = reader.readLine(); // 读取第4行
            String line5 = reader.readLine(); // 读取第4行

            // 更新文本输入框的内容
            filePathField.setText(line1 != null ? line1 : "");
            //fromField.setText(line2 != null ? line2 : "");
            //toField.setText(line3 != null ? line3 : "");
            homeFilePathField.setText(line4 != null ? line4 : "");
            studentFilePathField.setText(line5 != null ? line5 : "");
            if (studentFilePathField.getText().equals("")){
                studentFilePathField.setText(StudentTool.FILE_NAME_STUDENT);
            }else {
                StudentTool.FILE_NAME_STUDENT=studentFilePathField.getText();
            }
        } catch (IOException ex) {
            // 显示错误消息
            JOptionPane.showMessageDialog(this, "Error reading file: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    // 主方法用于测试
    public static void main(String[] args) {
        // 创建HomeView实例并显示
        SwingUtilities.invokeLater(() -> {
            HomeView view = new HomeView();
            view.setVisible(true);
        });
    }

}